#include <stdlib.h>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>

// Подсчитать количество объектов на растровом изображении
// Предназначено для подсчёта лиц "в фас",
// но может использоваться и для другого класса объектов.
// License: MIT

void DumpCount(char *fn, char *fnc) {

  cv::Mat gray;
  gray = cv::imread(fn, cv::IMREAD_GRAYSCALE);
  int w = gray.cols;
  int h = gray.rows;

  cv::CascadeClassifier *cs = new cv::CascadeClassifier();
  std::vector<cv::Rect> objects;
  cs->load(fnc);
  cs->detectMultiScale(
    gray,
    objects,
    1.1,
    3,
    cv::CASCADE_FIND_BIGGEST_OBJECT,
    cv::Size(12,12), // for Haar
    cv::Size(w,h)
  );
  std::cout << objects.size() << std::endl;
}

int main (int argc, char **argv) {
  if (argc < 2) {
    std::cout << "No args" << std::endl;
    std::cout << "Usage: facedetect-cv image-file [obj-cascade.xml]" << std::endl;
    return 1;
  }
  char *fn = argv[1];
  char *fnc = (char *)"/usr/share/data/facedetect-cv/haarcascade_frontalface_alt.xml";
  if (argc > 2) fnc = argv[2];
  DumpCount(fn, fnc);
  return 0;
}
